precision highp float;

varying vec2 vTextureCoord; // 从顶点着色器传来的纹理坐标

uniform sampler2D s_TextureMap; // 纹理采样器
uniform vec2 u_TouchXY;         // 点击的位置（归一化）
uniform vec2 u_TexSize;         // 纹理尺寸
uniform float u_Time;           // 归一化的时间
uniform float u_Boundary;       // 边界 0.1
uniform float u_WaveAmplitude;  // 波浪幅度，控制波浪的强度

void main() {
    float ratio = u_TexSize.y / u_TexSize.x;

    // 根据纹理尺寸，对采样坐标进行转换
    vec2 texCoord = vTextureCoord * vec2(1.0, ratio);
    vec2 touchXY = u_TouchXY * vec2(1.0, ratio); // 根据纹理尺寸，对中心点坐标进行转换

    // 计算采样点与点击位置的距离
    float distance = distance(texCoord, touchXY);

    // 判断是否在变形区域内
    if ((u_Time - u_Boundary) > 0.0
    && (distance <= (u_Time + u_Boundary))
    && (distance >= (u_Time - u_Boundary))) {

        // 计算波浪的移动距离，使用u_WaveAmplitude来控制波浪幅度
        float x = (distance - u_Time); // 输入 diff = x
        // 用幅度控制波浪的强度
        float moveDis = u_WaveAmplitude * 10.0 * x * (x - 0.1) * (x + 0.1); // 波浪幅度控制

        vec2 unitDirectionVec = normalize(texCoord - touchXY); // 单位方向向量

        // 采样坐标偏移（实现放大和缩小效果）
        texCoord = texCoord + (unitDirectionVec * moveDis);
    }

    // 采样坐标转换回原始比例
    texCoord = texCoord / vec2(1.0, ratio);

    // 获取纹理颜色并输出
    gl_FragColor = texture2D(s_TextureMap, texCoord);
}
